package edu.mju.interceptor;

import java.lang.reflect.Method;

/**
 * @Author:wyp
 * @Date:2020/9/19 15:53
 */
public interface Interceptor {
    /**
     * 在真实对象前调用
     * @param proxyObject 代理对象
     * @param realObject 真实对象
     * @param method 方法
     * @param args 方法参数
     * @return true:反射真实对象的方法；false:调用around()方法
     */
    boolean before(Object proxyObject, Object realObject, Method method, Object[] args);

    /**
     * 在before()方法返回false时，调用该方法
     * @param proxyObject 代理对象
     * @param realObject 真实对象
     * @param method 方法
     * @param args 方法参数
     */
    void around(Object proxyObject, Object realObject, Method method, Object[] args);

    /**
     * 在反射真实对象方法或者around()方法执行之后，调用after()方法
     * @param proxyObject 代理对象
     * @param realObject 真实对象
     * @param method 方法
     * @param args 方法参数
     */
    void after(Object proxyObject, Object realObject, Method method, Object[] args);
}
